/*
 * @lc app=leetcode.cn id=541 lang=cpp
 *
 * [541] 反转字符串 II
 *
 * https://leetcode-cn.com/problems/reverse-string-ii/description/
 *
 * algorithms
 * Easy (59.69%)
 * Likes:    268
 * Dislikes: 0
 * Total Accepted:    100.6K
 * Total Submissions: 168.7K
 * Testcase Example:  '"abcdefg"\n2'
 *
 * 给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。
 * 
 * 
 * 如果剩余字符少于 k 个，则将剩余字符全部反转。
 * 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
 * 
 * 
 * 
 * 
 * 示例 1：
 * 
 * 
 * 输入：s = "abcdefg", k = 2
 * 输出："bacdfeg"
 * 
 * 
 * 示例 2：
 * 
 * 
 * 输入：s = "abcd", k = 2
 * 输出："bacd"
 * 
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 1 <= s.length <= 10^4
 * s 仅由小写英文组成
 * 1 <= k <= 10^4
 * 
 * 
 */

// @lc code=start
class Solution {
public:
    string reverseStr(string s, int k) {
        for(int i = 0; i < s.size(); i += (2 * k)){
            // //这种情况反转的是 k 是满员情况
            // if(i + k <= s.size()){
            //     reverse(s, i, i + k -1);
            // }
            // //这种情况反转的是 k 不是满员情况
            // else reverse(s, i, s.size()-1);
            
            
            //这种情况反转的是 k 是满员情况
            if(i + k <= s.size()){
                reverse(s, i, i + k -1);
                continue;
            }
            //这种情况反转的是 k 不是满员情况
           reverse(s, i, s.size()-1);


        }
        return s;
    }


    void reverse(string &s, int start, int end){
        for(int i = start, j = end; i < j; i++, j--){
            swap(s[i], s[j]);
        }
    }
};
// @lc code=end

